package com.eportal.util;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
import java.io.FileInputStream;
import java.util.Properties;
import java.util.Set;

public class MailUtil {


    public static void main(String[] args) throws Exception {

        Properties prop = new Properties();
        prop.setProperty("mail.host", "smtp.mxhichina.com");
        prop.setProperty("mail.transport.protocol", "smtp");
        prop.setProperty("mail.smtp.auth", "true");
        //使用JavaMail发送邮件的5个步骤
        //1、创建session
        Session session = Session.getInstance(prop);
        //开启Session的debug模式，这样就可以查看到程序发送Email的运行状态
        session.setDebug(true);
        //2、通过session得到transport对象
        Transport ts = session.getTransport();
        //3、使用邮箱的用户名和密码连上邮件服务器，发送邮件时，发件人需要提交邮箱的用户名和密码给smtp服务器，用户名和密码都通过验证之后才能够正常发送邮件给收件人。
        ts.connect("smtp.mxhichina.com", "system@imiaodou.com", "mail@1688");
        //4、创建邮件
        Message message = createImageMail(session);
        //5、发送邮件
        ts.sendMessage(message, message.getAllRecipients());
        ts.close();
    }

    /**
     * @param mProperty  邮箱属性配置
     * @param subject    主题
     * @param content    邮件内容
     * @param recipients 接收人
     * @throws Exception
     */
    public static void send(MailProperty mProperty, String subject, String content, String recipients) throws Exception {
        Properties prop = new Properties();
        prop.setProperty("mail.host", mProperty.getHost());
        prop.setProperty("mail.transport.protocol", mProperty.getProtocol());
        prop.setProperty("mail.smtp.auth", mProperty.getAuth());
        //使用JavaMail发送邮件的5个步骤
        //1、创建session
        Session session = Session.getInstance(prop);
        //开启Session的debug模式，这样就可以查看到程序发送Email的运行状态
        session.setDebug(true);
        //2、通过session得到transport对象
        Transport ts = session.getTransport();
        //3、使用邮箱的用户名和密码连上邮件服务器，发送邮件时，发件人需要提交邮箱的用户名和密码给smtp服务器，用户名和密码都通过验证之后才能够正常发送邮件给收件人。
        ts.connect(mProperty.getUsername(), mProperty.getPassword());
        //4、创建邮件
        Message message = createSimpleMail(session, subject, content, mProperty.getSender(), recipients);
        //5、发送邮件
        ts.sendMessage(message, message.getAllRecipients());
        ts.close();
    }

    /**
     * 发送简单email（文本）
     *
     * @param session
     * @param subject
     * @param content
     * @param from
     * @param recipients
     * @return
     * @throws Exception
     */
    private static MimeMessage createSimpleMail(Session session, String subject, String content, String from, String recipients)
            throws Exception {
        //创建邮件对象
        MimeMessage message = new MimeMessage(session);
        //指明邮件的发件人
        message.setFrom(new InternetAddress(from));
        //指明邮件的收件人，现在发件人和收件人是一样的，那就是自己给自己发
        message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));
        //邮件的标题
        message.setSubject(subject);
        //邮件的文本内容
        message.setContent(content, "text/html;charset=UTF-8");
        //返回创建好的邮件对象
        return message;
    }


    /**
     * @param session
     * @return
     * @throws Exception
     * @Method: createImageMail
     * @Description: 生成一封邮件正文带图片的邮件
     * @Anthor:孤傲苍狼
     */
    private static MimeMessage createImageMail(Session session) throws Exception {
        //创建邮件
        MimeMessage message = new MimeMessage(session);
        // 设置邮件的基本信息
        //发件人
        message.setFrom(new InternetAddress("zshuming2015@163.com"));
        //收件人
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("969991013@qq.com"));
        //邮件标题
        message.setSubject("带图片的邮件");
        /*邮件消息内容设置，包括两个附件和一段正文*/
        Multipart msgPart = new MimeMultipart("mixed");
        message.setContent(msgPart);
        MimeBodyPart body = new MimeBodyPart();
        MimeBodyPart attach = new MimeBodyPart();
        msgPart.addBodyPart(body);
        msgPart.addBodyPart(attach);

        /*正文是文字和图片混合的*/
        Multipart contentPart = new MimeMultipart("related");
        body.setContent(contentPart);
        MimeBodyPart content = new MimeBodyPart(); //文字
        MimeBodyPart img = new MimeBodyPart();     //图片
        contentPart.addBodyPart(content);
        contentPart.addBodyPart(img);

        ByteArrayDataSource fileds = new ByteArrayDataSource(new FileInputStream("E:\\Download\\image\\1.jpg"), "application/octet-stream");
        DataHandler imgDataHandler = new DataHandler(fileds);
        img.setDataHandler(imgDataHandler);
        //注意：Content-ID的属性值一定要加上<>，不能是touxiang.jpg
        img.setHeader("Content-ID", "<1.jpg>");
        //为图片设置文件名，有的邮箱会把html内嵌的图片也当成附件
        img.setFileName("1.jpg");
        //设置文字内容
        /**
         * 注意：在html代码中要想显示刚才的touxiang.jpg
         * src里不能直接写Content-ID的值，要用cid:这种方式
         */
        content.setContent("<div style='color:red;font-size:18px;'><img src='http://img02.taobaocdn.com/tps/i2/T1d1pwXh4wXXXXXXXX-234-37.gif'>从sohu发来的邮件</div>：我这里有一张图片<img src='cid:1.jpg' alt='1' width=\"100px\" height='100px' />,好看吗？", "text/html;charset=utf-8");
        /*正文内容设置结束*/


        /*设置附件*/
        /*下面为设置附件*/
        attach.setDataHandler(new DataHandler(new FileDataSource("E:\\Download\\image\\1.jpg")));
        attach.setFileName("1.jpg");

        message.setContent(msgPart);

        //返回创建好的邮件
        return message;
    }
}